package br.com.dips.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;

import br.com.dips.enums.Situacao;

@Entity
@NamedQueries({
	@NamedQuery(name="UsuarioOrganizacao.autenticacao", query="select usrOrg from UsuarioOrganizacao usrOrg left join fetch usrOrg.atribuicoes where usrOrg.organizacao.id = :idOrg and usrOrg.usuario.senha = :senha and usrOrg.usuario.nomeUsuario = :nomeUsuario")
})
public class UsuarioOrganizacao implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id 
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	
	@NotNull
	private Character situacao;
	
	@ManyToOne
	@JoinColumn(name = "USUARIO_ID")
	private Usuario usuario;
	
	@ManyToOne
	@JoinColumn(name = "ORGANIZACAO_ID")
	private Organizacao organizacao;
	
	@OneToMany(mappedBy = "usuarioOrganizacao", fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
	private List<AtribuicaoUsuarioOrganizacao> atribuicoes;
	
	public UsuarioOrganizacao() {
		this.situacao = Situacao.ATIVO.getCodigo();
		this.atribuicoes = new ArrayList<AtribuicaoUsuarioOrganizacao>();
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Situacao getSituacao() {
		return Situacao.fromCodigo(this.situacao);
	}

	public void setSituacao(Situacao situacao) {
		this.situacao = situacao.getCodigo();
	}
	
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Organizacao getOrganizacao() {
		return organizacao;
	}

	public void setOrganizacao(Organizacao organizacao) {
		this.organizacao = organizacao;
	}
	
	public void addAtribuicao(AtribuicaoUsuarioOrganizacao atribuicao) {
		this.atribuicoes.add(atribuicao);
	}
	
	public List<AtribuicaoUsuarioOrganizacao> getAtribuicoes() {
		return atribuicoes;
	}

	public void setAtribuicoes(List<AtribuicaoUsuarioOrganizacao> atribuicoes) {
		this.atribuicoes = atribuicoes;
	}
	
	
	
}
